package com.qiqi.ctbluetooth

import android.app.Application
import android.content.Context
import cn.wandersnail.bluetooth.BTManager
import cn.wandersnail.commons.poster.ThreadMode
import com.chuckerteam.chucker.api.ChuckerCollector
import com.chuckerteam.chucker.api.ChuckerInterceptor
import com.clj.fastble.BleManager
import com.drake.brv.utils.BRV
import com.drake.engine.base.Engine
import com.drake.net.NetConfig
import com.drake.net.cookie.PersistentCookieJar
import com.drake.net.interceptor.LogRecordInterceptor
import com.drake.net.okhttp.setConverter
import com.drake.net.okhttp.setDebug
import com.drake.net.okhttp.setDialogFactory
import com.drake.net.okhttp.setErrorHandler
import com.drake.net.okhttp.trustSSLCertificate
import com.drake.tooltip.dialog.BubbleDialog
import com.kongzue.dialogx.DialogX
import okhttp3.Cache
import java.util.concurrent.TimeUnit


class BaseApp :Application() {
    companion object {
        lateinit var appContext: Context
    }
    override fun onCreate() {
        super.onCreate()
        appContext = applicationContext
        DialogX.init(this);
        DialogX.globalTheme = DialogX.THEME.LIGHT;
        DialogX.onlyOnePopTip = false;
        Engine.initialize(this)
        BRV.modelId = BR.m
        //构建自定义实例，需要在EasyBLE.getInstance()之前
        val manager: BTManager = BTManager.getBuilder()
            .setObserveAnnotationRequired(false) //不强制使用{@link Observe}注解才会收到被观察者的消息，强制使用的话，性能会好一些
            .setMethodDefaultThreadMode(ThreadMode.BACKGROUND) //指定回调方法和观察者方法的默认线程
            .build()
        manager.initialize(this)

        //初始化FastBle
        BleManager.getInstance().init(this);
        BleManager.getInstance().apply {
            enableLog(true) //默认打开库中的运行日志，如果不喜欢可以关闭
            setReConnectCount(1, 5000) //设置连接时重连次数和重连间隔（毫秒），默认为0次不重连
            splitWriteNum = 20 //设置分包发送的时候，每一包的数据长度，默认20个字节
            connectOverTime = 10000 //设置连接超时时间（毫秒），默认10秒
            operateTimeout = 5000; //配置操作超时
        }


    }
    private fun initNet(){
        NetConfig.initialize(Api.HOST,this){
            // 超时设置
            connectTimeout(20, TimeUnit.SECONDS)
            readTimeout(20, TimeUnit.SECONDS)
            writeTimeout(20, TimeUnit.SECONDS)

            followRedirects(false)
            //信任所有Https证书
            trustSSLCertificate()
            // 本框架支持Http缓存协议和强制缓存模式
            cache(Cache(cacheDir, 1024 * 1024 * 128)) // 缓存设置, 当超过maxSize最大值会根据最近最少使用算法清除缓存来限制缓存大小

            // LogCat是否输出异常日志, 异常日志可以快速定位网络请求错误
            setDebug(BuildConfig.DEBUG)

            // AndroidStudio OkHttp Profiler 插件输出网络日志
            addInterceptor(LogRecordInterceptor(BuildConfig.DEBUG))
//
            //添加token拦截器
//            addInterceptor(AddHeaderRequestInterceptor())
//            setErrorHandler(NetworkingErrorHandler())

            // 通知栏监听网络日志
            if (BuildConfig.DEBUG) {
                addInterceptor(
                    ChuckerInterceptor.Builder(appContext)
                        .collector(ChuckerCollector(appContext))
                        .maxContentLength(250000L)
                        .redactHeaders(emptySet())
                        .alwaysReadResponseBody(false)
                        .build()
                )
            }

            // 添加持久化Cookie管理
            cookieJar(PersistentCookieJar(appContext))

            // 通知栏监听网络日志
            // 添加请求拦截器, 可配置全局/动态参数
//            setRequestInterceptor(GlobalHeaderInterceptor())

            // 数据转换器
            setConverter(SerializationConverter())
            // 自定义全局加载对话框
            setDialogFactory {
                BubbleDialog(it, "加载中...")
            }

        }

    }


}